/******************************************************************************
 * @brief: gp30 task
 * @Author:   aple
 * @Date: 2022-12-14 18:06:21
 * @LastEditors: aple
 * @LastEditTime: 2023-02-05 09:24:00
 * @Verision: 1.0.0.0
 ******************************************************************************/
#ifndef __GP30TASK_H
#define __GP30TASK_H

#include <stdint.h>
#include "dataproc.h"
#include "pulse.h"
#include "mytype.h"

#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
 * @brief   micro. port
 *****************************************************************************/
#define com_gp30 com.obj08
#define com_mirro com.obj03

/******************************************************************************
 * @brief   micro. CMD
 *****************************************************************************/
#define GP30_CMD_NONE 0
#define GP30_CMD_READ_2208 1
#define GP30_CMD_READ_2301 2

#define GP30_CMD_Q_SET 0x10
#define GP30_CMD_METER_RD 0x11
#define GP30_CMD_T_SET 0x12
#define GP30_CMD_INFO_SET 0x13
#define GP30_CMD_INFO_GET 0x14
#define GP30_CMD_CLR_FLOW 0x15

	/******************************************************************************
	 * @brief   var
	 *****************************************************************************/
	typedef struct
	{
		uu08 id[6];	  // ID, HEX
		uu08 version; // 版本
		struct
		{
			ii32 m3;  // 整立方数
			ii32 mL;  // 小数毫升
		} total_flow; // 累计流量m3+mL
		struct
		{
			ii32 m3;
			ii32 mL;
		} total_nflow; // 累计负流量

		ii32 rt_flow_mL; // 瞬时流量, 单位mL
		ii32 am_mV;		 // 波幅, 单位mV
		ii32 temp;		 // 温度, 1LSB = 0.01度
		uu08 st[2];
	} gp30_rd_dat_type;

	typedef struct
	{
		ii08 opt_type;
		uu08 page;
	} gp30_ui_type;

	typedef struct 
	{
		uu32 fac_code;
		uu32 dev_id;
		uu16 year,mon,dat,hour,min,sec;
	} gp30_info_set_type;
	

	typedef struct
	{
		// ID、代码类变量均为压缩BCD数

		uu08 dev_type_bcd; // 表类型
		uu32 dev_id_bcd;   // 表地址
		uu08 aux_id_bcd;   // 补充地址
		uu16 fac_code_bcd; // 厂家代码
		ii32 temp_in;  // 进水温度
		ii32 temp_out; // 出水温度
		struct 
		{
			uu16 year;
			uu16 day;
			uu16 mon;
		} rtct;
		
		struct
		{
			ii32 m3;
			ii32 mL;
		} flow_sum; // 累计流量
		struct
		{
			ii32 kWh;
			ii32 W0_1h;
		} heat_sum; // 累计热量

		ii32 alr_time;	// 累计报警时间
		uu08 pipe_size; // 管段尺寸
		uu08 version_bcd;	// 版本号
		uu32 serial_bcd;	// 序列号

		uu16 Q4_coef;
		uu16 Q3_coef;
		uu16 Q2_coef;
		uu16 Q1_coef;
		uu16 Q3_0_1_coef;	// 0.1Q3
		uu16 Q2_4_coef;		// 4 Q2
		uu16 Q2_1_6_coef;	// 1.6 Q2
		uu16 Q1_0_625_coef; // 0.625Q1

		uu08 alr_bcd[2];
	} gp30_meter_rd_type;

	typedef struct
	{
		uu08 cmd_rsp;
		uu08 mirro_req;
		volatile uu08 cmd_req;

		uu08 q_set_mode;// 0-叠加，1-覆盖
		float q_set[3]; // 百分数
		float q_get[3]; // 百分数

		gp30_ui_type ui;
		gp30_rd_dat_type read_info;
		gp30_meter_rd_type meter_rd;
		gp30_info_set_type info_set;
	} gp30_st_type;

	extern gp30_st_type gp30_st;

	int gp30_cmd_rsp_handle(uu08 cmd, uu08 *dat, uu16 dlen);
	int gp30_cmd_transmit(uu08 cmd);

#ifdef __cplusplus
}
#endif

#endif /* __GP30TASK_H */
